home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / util / gnu / xpdf-0.8-src.lha / xpdf-0.8-src / ltk / LTKResources.cc < prev    next >
C/C++ Source or Header  |  1998-11-28  |  5KB  |  186 lines

  1. //========================================================================
  2. //
  3. // LTKResources.cc
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. #pragma implementation
  11. #endif
  12.  
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <stddef.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xresource.h>
  18. #include <X11/Xutil.h>
  19. #include "gtypes.h"
  20. #include "GString.h"
  21. #include "gfile.h"
  22. #include "LTKConfig.h"
  23. #include "LTKMisc.h"
  24. #include "LTKResources.h"
  25.  
  26. void ltkGetCmdLineResources(XrmDatabase *cmdLineDB, XrmOptionDescRec *opts,
  27.                 int numOpts, GString *appName,
  28.                 int *argc, char *argv[]) {
  29.   XrmParseCommand(cmdLineDB, opts, numOpts, appName->getCString(),
  30.           argc, argv);
  31. }
  32.  
  33. void ltkGetOtherResources(Display *display,
  34.               XrmDatabase cmdLineDB, XrmDatabase *db) {
  35.   XrmDatabase db1;
  36.   GString *s;
  37.   FILE *f;
  38.  
  39.   if (XResourceManagerString(display)) {
  40.     db1 = XrmGetStringDatabase(XResourceManagerString(display));
  41.     XrmMergeDatabases(db1, db);
  42.   } else {
  43. #ifdef VMS
  44.     s = new GString("DECW$USER_DEFAULTS:XPDF.DAT");
  45. #else
  46.     s = appendToPath(getHomeDir(), ".Xresources");
  47. #endif
  48.     if ((f = fopen(s->getCString(), "r"))) {
  49.       fclose(f);
  50.       db1 = XrmGetFileDatabase(s->getCString());
  51.       XrmMergeDatabases(db1, db);
  52.     }
  53.     delete s;
  54. #ifdef VMS
  55.     s = new GString("DECW$USER_DEFAULTS:DECW$XDEFAULTS.DAT");
  56. #else
  57.     s = appendToPath(getHomeDir(), ".Xdefaults");
  58. #endif
  59.     if ((f = fopen(s->getCString(), "r"))) {
  60.       fclose(f);
  61.       db1 = XrmGetFileDatabase(s->getCString());
  62.       XrmMergeDatabases(db1, db);
  63.     }
  64.     delete s;
  65.   }
  66.   XrmMergeDatabases(cmdLineDB, db);
  67. }
  68.  
  69. GString *ltkGetStringResource(XrmDatabase db, GString *appName,
  70.                   char *instName, char *def) {
  71.   GString *inst = appName->copy()->append(".")->append(instName);
  72.   XrmValue val;
  73.   char *resType[20];
  74.   GString *ret;
  75.  
  76.   if (XrmGetResource(db, inst->getCString(), inst->getCString(),
  77.              resType, &val))
  78.     ret = new GString(val.addr, val.size);
  79.   else
  80.     ret = def ? new GString(def) : (GString *)NULL;
  81.   delete inst;
  82.   return ret;
  83. }
  84.  
  85. int ltkGetIntResource(XrmDatabase db, GString *appName,
  86.               char *instName, int def) {
  87.   GString *inst = appName->copy()->append(".")->append(instName);
  88.   XrmValue val;
  89.   char *resType[20];
  90.   char s[20];
  91.   int ret, n;
  92.  
  93.   if (XrmGetResource(db, inst->getCString(), inst->getCString(),
  94.              resType, &val)) {
  95.     n = val.size <= 19 ? val.size : 19;
  96.     strncpy(s, val.addr, n);
  97.     s[n] = '\0';
  98.     ret = atoi(s);
  99.   } else {
  100.     ret = def;
  101.   }
  102.   delete inst;
  103.   return ret;
  104. }
  105.  
  106. GBool ltkGetBoolResource(XrmDatabase db, GString *appName,
  107.              char *instName, GBool def) {
  108.   GString *inst = appName->copy()->append(".")->append(instName);
  109.   XrmValue val;
  110.   char *resType[20];
  111.   char *s;
  112.   GBool ret;
  113.  
  114.   if (XrmGetResource(db, inst->getCString(), inst->getCString(),
  115.              resType, &val)) {
  116.     s = (char *)val.addr;
  117.     ret =  ((s[0] == 'o' || s[0] == 'O') && (s[1] == 'n' || s[1] == 'N')) ||
  118.        ((s[0] == 't' || s[0] == 'T') && (s[1] == 'r' || s[1] == 'R') &&
  119.         (s[2] == 'u' || s[2] == 'U') && (s[3] == 'e' || s[3] == 'E')) ||
  120.        ((s[0] == 'y' || s[0] == 'Y') && (s[1] == 'e' || s[1] == 'E') &&
  121.         (s[2] == 's' || s[2] == 'S'));
  122.   } else {
  123.     ret = def;
  124.   }
  125.   delete inst;
  126.   return ret;
  127. }
  128.  
  129. unsigned long ltkGetColorResource(XrmDatabase db, GString *appName,
  130.                   char *instName,
  131.                   Display *display, int screenNum,
  132.                   char *def1, unsigned long def2,
  133.                   XColor *xcol) {
  134.   GString *name;
  135.   XColor xcol1, xcol2;
  136.  
  137.   if (!xcol)
  138.     xcol = &xcol1;
  139.   name = ltkGetStringResource(db, appName, instName, def1);
  140.   if (!XAllocNamedColor(display, DefaultColormap(display, screenNum),
  141.             name->getCString(), xcol, &xcol2)) {
  142.     ltkError("Couldn't allocate color '%s'", name->getCString());
  143.     xcol->pixel = def2;
  144.     XQueryColor(display, DefaultColormap(display, screenNum), xcol);
  145.   }
  146.   delete name;
  147.   return xcol->pixel;
  148. }
  149.  
  150. XFontStruct *ltkGetFontResouce(XrmDatabase db, GString *appName,
  151.                    char *instName,
  152.                    Display *display, int screenNum,
  153.                    char *def) {
  154.   GString *name;
  155.   XFontStruct *fontStruct;
  156.  
  157.   name = ltkGetStringResource(db, appName, instName, def);
  158.   if (!(fontStruct = XLoadQueryFont(display, name->getCString()))) {
  159.     ltkError("Unknown font '%s'", name->getCString());
  160.     if (!(fontStruct = XLoadQueryFont(display, LTK_DEF_FONT))) {
  161.       ltkError("Can't find default font '%s' -- exiting", LTK_DEF_FONT);
  162.       exit(1);
  163.     }
  164.   }
  165.   delete name;
  166.   return fontStruct;
  167. }
  168.  
  169. void ltkGetGeometryResource(XrmDatabase db, GString *appName,
  170.                 char *instName,
  171.                 Display *display, int screenNum,
  172.                 int *x, int *y,
  173.                 Guint *width, Guint *height) {
  174.   GString *geom;
  175.   int flags;
  176.  
  177.   if ((geom = ltkGetStringResource(db, appName, instName, NULL))) {
  178.     flags = XParseGeometry(geom->getCString(), x, y, width, height);
  179.     delete geom;
  180.     if ((flags & XValue) && (flags & XNegative))
  181.       *x = DisplayWidth(display, screenNum) - *x;
  182.     if ((flags & YValue) && (flags & YNegative))
  183.       *y = DisplayHeight(display, screenNum) - *y;
  184.   }
  185. }
  186.